package JUC;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author 豆包LU
 * @date 2023/5/8 11:23
 */
public class LinkedBlockingQueueDemo {

    // 创建一个有界阻塞队列，最大容量为10
    private static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);

    public static void main(String[] args) {
        // 创建一个生产者线程和一个消费者线程
        Thread producer = new Thread(new Producer());
        Thread consumer = new Thread(new Consumer());

        // 启动生产者和消费者线程
        producer.start();
        consumer.start();
    }

    // 生产者线程
    static class Producer implements Runnable {
        @Override
        public void run() {
            try {
                // 生产者生产10个数字
                for (int i = 0; i < 10; i++) {
                    // 阻塞式将元素放入队列中
                    queue.put(i);
                    System.out.println("Produced: " + i);
                    // 休眠500ms，模拟生产过程
                    Thread.sleep(2000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 消费者线程
    static class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                // 消费者消费10个数字
                for (int i = 0; i < 10; i++) {
                    // 阻塞式从队列中取出元素
                    Integer value = queue.take();
                    System.out.println("Consumed: " + value);
                    // 休眠1000ms，模拟消费过程
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
